package main

import (
	"fmt"
	"time"
)

/*
channel（管道）
需求：计算1~200的各个数的阶乘，并且把各个数的阶乘放入到map中，最后显示出来，要求使用goroutine完成
分析思路：
(1)使用goroutine来完成，效率高，但是会出现并发/并行安全问题
(2)这里就提出了不同goroutine如何通信的问题
代码实现:
(1)使用goroutine来完成
(2)在运行某个程序时，如何知道是否存在资源竞争问题，方法简单，在编译该程序时，增加一个参数 -race即可
go build -race main.go
*/
var (
	myMap = make(map[int]int, 10)
)

//test函数就是计算n!，将这个结果放入到map中
func test(n int) {
	res := 1
	for i := 1; i <= n; i++ {
		res *= i
	}
	//这里将res放入到myMap
	myMap[n] = res //concurrent map writes?
}
func main() {
	//开启多个协程
	for i := 1; i <= 200; i++ {
		go test(i)
	}
	//休眠几秒
	time.Sleep(time.Second)
	//输出结果
	for i, v := range myMap {
		fmt.Printf("map[%d]=%d\n", i, v)
	}
}
